/*//////////////////////////////////////////////////////////////////////////////
	Sistemas Computacionais 2011
Autores:
56777 Pedro Agostinho 
57671 Carlos Rodrigues 
58621 Mo Jianmin

Descricao:
Funcoes que chamam leitura e escrita de EEPROM externo com/sem indice, actualiza
indice escrita/leitura
Funcao verifica se EEPROM chegava a metade da capacidade
*///////////////////////////////////////////////////////////////////////////////

#include "../variaveis.h"
#include "eeprom.h"
#include "../operation_state.h"
#include <usart.h>
#include <stdio.h>
#include <p18f452.h>

void eepromleitura(unsigned char* mensagem){

	int octetos=8;
	unsigned char buffer[4];//guarda nr,ileitura, iescrita e checksom na EEPROM

	ReadEE((unsigned char) (ileitura*octetos),(unsigned char) ((ileitura*octetos)+7), mensagem,(unsigned char) octetos); 
	
	/*actualiza o indice de leitura*/
	ileitura++;
	if(ileitura>=NREG){
		ileitura=ileitura-NREG;
	}
	
	/*actualiza o numero de registos validos*/
	nr--;

	/*guarda index de memoria*/
	buffer[0]=ileitura;
	buffer[1]=iescrita;
	buffer[2]=nr;
	buffer[3]=ileitura+iescrita+nr;
	WriteEE((unsigned char) ((NREG)*octetos),(unsigned char) (((NREG)*octetos)+4), buffer,(unsigned char) 4);

	if(nr<=NREG/2) {
		flags.half_mem =0;
		saveFlags();
		}
}

void eepromescrita(unsigned char* mensagem){
	
	int octetos=8;
	unsigned char buffer[4];
	
	WriteEE((unsigned char) (iescrita*octetos),(unsigned char) ((iescrita*octetos)+7), mensagem ,(unsigned char) octetos); 
	
	/*actualiza o numero de registos validos*/
	nr++;
	
	if(nr > NREG){
		nr=NREG;
	}
	if(nr > (NREG/2)) 
		flags.half_mem =1;
	
	/*actualiza o indice de escrita e verefica se esta dentro dos valores*/
	iescrita++;
	if(iescrita>=NREG){ 
		iescrita=iescrita-NREG;
	}
	
	/*actualiza o indice de leiruta e verifica se esta conforme o indice de escrita*/
	if(nr == NREG){
		ileitura=iescrita+1;
	}

		/*guarda index de memoria*/
	buffer[0]=ileitura;
	buffer[1]=iescrita;
	buffer[2]=nr;
	buffer[3]=ileitura+iescrita+nr;	
	WriteEE((unsigned char) ((NREG)*octetos),(unsigned char) (((NREG)*octetos)+4), buffer,(unsigned char) 4);
	
}

void indexReadEEPROM(unsigned char *message, int index){
}
void memoria_cheia(void){




	unsigned char msg[7], registro[8]; //msg para enviar para eCOs buf para EEPROM
	int i;
	
	 if(flags.half_mem){ 

		msg[0]= SOM;
        msg[1]= NMCH;// NMHC
		msg[2]= NREG;
		msg[3]= nr;
		msg[4]= iescrita;
		msg[5]= ileitura;
		msg[6]= EOM;

		for(i=0; i<7; i++){
			while (BusyUSART());
	    	putcUSART(msg[i]);
		}
		
		registro[0] = status.time_h;
		registro[1] = status.time_m;
		registro[2] = status.time_s;
		registro[3] = ENMCH;
		registro[4] = NREG;
		registro[5] = nr;
		registro[6] = iescrita;
		registro[7] = ileitura;
		eepromescrita(registro);
	}
}

void gerenciaDados(){
	
	if(mod_r == 1 && termina_conf == 1){
			registro[0] = aux.time_h;
			registro[1] = aux.time_m;
			registro[2] = aux.time_s;
			registro[3] = ECLK;
			registro[4] = status.time_h;
			registro[5] = status.time_m;
			registro[6] = status.time_s;
			registro[7] = NULL;
			eepromescrita(registro);				
			memoria_cheia();	
		}
		
		if(mod_a == 1&& termina_conf == 1){
			registro[0] = status.time_h;
			registro[1] = status.time_m;
			registro[2] = status.time_s;
			registro[3] = EDALA;
			registro[4] = alarm.time_h;
			registro[5] = alarm.time_m;
			registro[6] = alarm.time_s;
			registro[7] = NULL;
			eepromescrita(registro);	
			memoria_cheia();
		}

		if(mod_t == 1&& termina_conf == 1){
			registro[0] = status.time_h;
			registro[1] = status.time_m;
			registro[2] = status.time_s;
			registro[3] = EALT;
			registro[4] = alarm.temp;
			registro[5] = registro[6] = registro[7] = NULL;
			eepromescrita(registro);
			memoria_cheia();			
		}

		if(mod_l == 1&& termina_conf == 1){
			registro[0] = status.time_h;
			registro[1] = status.time_m;
			registro[2] = status.time_s;
			registro[3] = EDALL;
			registro[4] = alarm.light;
			registro[5] = registro[6] = registro[7] = NULL;
			eepromescrita(registro);
			memoria_cheia();
		}

		if(mod_A == 1&& termina_conf == 1){
			registro[0] = status.time_h;
			registro[1] = status.time_m;
			registro[2] = status.time_s;
			registro[3] = EAALS;
			registro[4] = status.temp;
			registro[5] = status.light;
			registro[6] = registro[7] = NULL;
			eepromescrita(registro);

			memoria_cheia();
	   }
}


